package bmCheckClassId.index_html;

import com.rslai.commons.util.excel.ExcelWrite;
import com.rslai.commons.util.excel.Head;
import com.rslai.commons.util.excel.exception.ExcelException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

/**
 * Created by rslai on 2018/12/10.
 */
public class Index {

    /**
     * 在页面 http://bm.huatu.com 中获得全部课程列表
     */
    public void getClassList() throws IOException, ExcelException {
        System.out.println("在页面 http://bm.huatu.com 中获得全部课程列表......");

        Document doc = Jsoup.connect("http://bm.huatu.com").get(); // 加载 bm 首页

        Elements allClass = doc.select(".focus_list"); // 通过选择器得到全部课程

        if (allClass.size() != 1) {
            System.out.println("    根据 class “.focus_list” 获取全部课程失败，应该查到 1 个元素，却找到 " + allClass.size() + " 个元素");
            return;
        }

        Element allClassElement = allClass.get(0); // 所有课程的 Element

        // 得到所有课程文字列表
        List<String> classStringList = new LinkedList<String>(); // 所有课程文字列表
        for (Element e : allClassElement.select("li")) {
            classStringList.add(e.text());
        }

        Elements classLinks = allClassElement.select("div .fl_city"); // 所有课程连接列表
        if (classStringList.size() != allClassElement.select("div .fl_city").size()) {
            System.out.println("    根据 “li” 获取全部课程文字列表，与“div .fl_city”获得的课程连接列表数量不符。 文字列表：" + classStringList.size() + " 课程连接列表：" + allClassElement.select("div .fl_city").size());
            return;
        }

        ExcelWrite excelWrite = this.createClassListExcel();
        int classIndex = 0;
        for (Element fl_city : allClassElement.select("div .fl_city")) {
            System.out.println("    遍历：" + classStringList.get(classIndex));
            int i = 0;
            for (Element city_link : fl_city.select("h4")) {
                for (Element e2 : city_link.parent().select("p").get(i).select("a")) {
                    excelWrite.addBody(new String[]{classStringList.get(classIndex), city_link.text(), e2.text(), e2.attr("href")});
                }
                i++;
            }
            classIndex++;
        }

        // 分类爬完后关闭excel文件
        FileOutputStream fos = new FileOutputStream("./output/cityUrlList.xls");
        excelWrite.write(fos);
        fos.close();

        System.out.println("在页面 http://bm.huatu.com 中获得全部课程列表，成功！");
    }


    /**
     * 创建课程列表excel
     * @return excel对象
     * @throws ExcelException
     */
    private ExcelWrite createClassListExcel() throws ExcelException {
        ExcelWrite excelWrite = new ExcelWrite();
        Head head;
        head = new Head(0, "课程分类", 20, null);
        excelWrite.addHead(head);
        head = new Head(1, "课程类别", 20, null);
        excelWrite.addHead(head);
        head = new Head(2, "城市", 20, null);
        excelWrite.addHead(head);
        head = new Head(3, "城市 URL", 50, null);
        excelWrite.addHead(head);
        head = new Head(4, "是否爬完", 15, null);
        excelWrite.addHead(head);
        return excelWrite;
    }

}
